// AC
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using P = pair<int, int>;

// 方向数组：上、右、下、左
const int di[] = {-1, 0, 1, 0};
const int dj[] = {0, 1, 0, -1};
const int MAX_H = 3005; // 最大高度
const int MAX_W = 3005; // 最大宽度

int main() {
  int h, w, k; // 网格高度、宽度和初始点数
  cin >> h >> w >> k;

  const int INF = 1001001001; // 表示无穷大的值
  int dist[MAX_H][MAX_W];     // 存储每个点到最近初始点的距离
  bool checked[MAX_H][MAX_W]; // 标记是否已检查过该点
  queue<P> q;                 // BFS队列

  // 初始化数组
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j) {
      dist[i][j] = INF; // 初始距离设为无穷大
      checked[i][j] = false;
    }
  }

  // 读入初始点并初始化队列
  for (int i = 1; i <= k; ++i) {
    int r, c;
    cin >> r >> c;
    dist[r][c] = 0;  // 初始点距离为0
    q.emplace(r, c); // 加入队列
  }

  // BFS处理
  while (!q.empty()) {
    int i, j;
    tie(i, j) = q.front();
    q.pop();
    // 检查四个方向
    for (int d = 0; d < 4; ++d) {
      int ni = i + di[d], nj = j + dj[d];
      // 边界检查
      if (ni < 1 || nj < 1 || ni > h || nj > w)
        continue;
      // 如果已经计算过距离则跳过
      if (dist[ni][nj] != INF)
        continue; // 已确定最短距离则跳过

      if (checked[ni][nj]) {           // 第二次被访问
        dist[ni][nj] = dist[i][j] + 1; // 确定最短距离
        q.emplace(ni, nj);             // 加入队列
      } else {
        checked[ni][nj] = true; // 第一次访问只做标记
      }
    }
  }

  // 计算所有点的距离总和
  ll ans = 0;
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j) {
      if (dist[i][j] != INF) // 只计算可达点的距离
        ans += dist[i][j];
    }
  }

  cout << ans << '\n';

  return 0;
}